/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"2F1DA2A4-1852-4E07-A630-E28B228D5607",variableType:8}
 */
var MILLSECS_PER_DAY = 24 * 60 * 60 * 1000;


/**
 * 
 * @param {Date} fecha_mayor
 * @param {Date} fecha_menor
 * @return {Number} cantidad de dias entre las fechas
 * @properties={typeid:24,uuid:"8A776FA4-36F7-48A9-9401-4E3B751C8819"}
 */
function diferenciaDias(fecha_mayor, fecha_menor) {
	return Math.floor(Math.abs((fecha_mayor.getTime() - fecha_menor.getTime() ) / MILLSECS_PER_DAY))
}

/**
 * @param {Number} mes
 * @param {Number} anio
 *
 * @properties={typeid:24,uuid:"F5CF0ADA-0892-452E-BB96-BE0562E14A77"}
 */
function cantDiasMes(mes, anio)
{
	if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
	{
		return 31
	}
	else
	{
		if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
		{
			return 30
		}
		else
		{
			if (mes == 2)
			{
				if (anioBisiesto(anio) == true)
				{
					return 29
				}
				else
				{
					return 28
				}
			}
		}
	}
	return 0
}

/**
 * @param {Number} anio
 *
 * @properties={typeid:24,uuid:"2CE94972-0EA4-46D1-BF30-E8F0DA24E688"}
 */
function cantDiasAnio(anio)
{
	if (anioBisiesto(anio) == true)
		return 366
	return 365
}
/**
 * @param {Number} anio
 *
 * @properties={typeid:24,uuid:"473F3FAE-D0E9-4EA9-AC8E-9F9086E2D121"}
 */
function anioBisiesto(anio)
{
	if ((anio % 4 == 0) && ((anio % 100 != 0) || (anio % 400 == 0)))
		return true
	return false
}
/**
 * 
 * @param {Number} mes Mes a mostrar
 * @param {Number} anio Mes a mostrar
 * @param {Date} fecha_desde Fecha limite para poder elegir
 * @param {Date} fecha_hasta Fecha limite para poder elegir
 * @param {String} tipo Como se muestra ('POPUP' o 'WIN')
 * @param {Array<Number>} [dias_habilitados] Del 1 al 7 siendo 1 el Lunes
 * @param {String} estilo
 * 
 * @example 	var $form = globals.mostrarCalendarioMes(globals.gHoy.getMonth()+1, globals.gHoy.getFullYear(), $fDesde, $fHasta, 'POPUP', null, 'estilo')
 *	plugins.window.showFormPopup(elements.fld_fecha_desde,forms[$form],globals,'gFechaDesde')
 * 
 * @properties={typeid:24,uuid:"08C6C26E-6110-49E2-978C-F7E4659D801B"}
 */
function mostrarCalendarioMes(mes, anio, fecha_desde, fecha_hasta, tipo, dias_habilitados, estilo) {
	var $name = "calendario_mes"
	forms.calendario.fFechaDesde = fecha_desde
	forms.calendario.fFechaHasta = fecha_hasta
	forms.calendario.fMes 		= mes
	forms.calendario.fAnio 		= anio
	forms.calendario.fTipo		= tipo
	forms.calendario.fEstilo	= estilo
	forms.calendario.elements.tab_calendar.removeAllTabs()
	history.removeForm($name);
	solutionModel.removeForm($name);
	
	plugins.DateUtils.firstDayOfWeek = plugins.DateUtils.DAY.MONDAY
	
	var $fecha 		 = new Date(anio,mes-1,1,0,0,0,0)
	var $diaFinalMes = plugins.DateUtils.DateTime($fecha).getLastDayOfMonth().getLastDayOfWeek().toEndOfDay().date;	
	if (mes == 12)
	{
		var $fecha2 = new Date(anio+1,mes-1,1,0,0,0,0)
		$diaFinalMes = plugins.DateUtils.DateTime($fecha2).getLastDayOfMonth().getLastDayOfWeek().toEndOfDay().date;	
	}
	var $diaPpioMes	 = plugins.DateUtils.DateTime($fecha).getFirstDayOfMonth().getFirstDayOfWeek().toStartOfDay().date;
	var $semanas 	 = plugins.DateUtils.getDayDifference($diaPpioMes, plugins.DateUtils.DateTime($diaFinalMes).addDays(1)) / 7;
	
	var $frm = solutionModel.newForm($name, null, estilo, false, 280, 170);
	$frm.navigator = SM_DEFAULTS.NONE
	
	var $var = $frm.newVariable('fTipo',JSVariable.TEXT)
	$var.defaultValue = '"'+ tipo +'"'
	$frm.newMethod('function cerrarForm(devuelve) {	if (fTipo == "POPUP") { if (devuelve == true) plugins.window.closeFormPopup(fFechaElegida); else plugins.window.cancelFormPopup() } else {	var $win = controller.getWindow(); $win.hide() ; $win. destroy; } }')
	var $metodo = $frm.newMethod('function eligeFecha(event) { fFechaElegida = utils.parseDate(event.getElementName(),"dd-MM-yyyy"); cerrarForm(true) }')
	
	var $xInicial = 15;
	var $yInicial = 40;
	var $ppio = plugins.DateUtils.DateTime($diaPpioMes);

	for (var w = 1 ; w <= $semanas ; w++) {
		for (var d = 1; d <= 7; d++) {
			if (w == 1) {
				var $titulo = $frm.newLabel(utils.dateFormat(new Date($diaPpioMes.getFullYear(),$diaPpioMes.getMonth(),$diaPpioMes.getDate() + (d-1),0,0,0),"EEE"), $xInicial + (40*(d-1)), $yInicial - 20, 40, 20);
				$titulo.name = "lbl_header_day_" + d;
				$titulo.styleClass = "negrita";
				$titulo.transparent = true
			}
			var $dia = $frm.newButton($ppio.day + "",$xInicial + (40*(d-1)),$yInicial + ((w-1)*20),20,20, $metodo);
			var $ppio_aux = $ppio.day+'-'+($ppio.month+1)+'-'+$ppio.year //new Date($ppio.year,$ppio.month,$ppio.day,0,0,0,0)
			var $ppio_aux2 = new Date($ppio.year,$ppio.month,$ppio.day,0,0,0,0)
			$dia.name = $ppio_aux
			$dia.transparent = true
			$dia.showClick = false
			$dia.horizontalAlignment = SM_ALIGNMENT.CENTER
			$dia.rolloverCursor = SM_CURSOR.HAND_CURSOR
			
			if ($ppio_aux2 < fecha_desde || $ppio_aux2 > fecha_hasta)
			{
				$dia.rolloverCursor = SM_CURSOR.DEFAULT_CURSOR
				$dia.styleClass = 'disabled'
				$dia.enabled = false
			}
			else
			{
				if (dias_habilitados == null || dias_habilitados.indexOf(d) != -1)
					$dia.enabled = true
				else
				{
					$dia.rolloverCursor = SM_CURSOR.DEFAULT_CURSOR
					$dia.styleClass = 'disabled'
					$dia.enabled = false	
				}
			}
			$ppio.addDays(1);
		}
	}
	forms[$frm.name].controller.recreateUI()
	forms[$frm.name].fMes = plugins.DateUtils.getMonthNames()[mes-1]
	forms[$frm.name].fAnio = anio
	forms.calendario.elements.tab_calendar.addTab($frm.name)
	return 'calendario'
}

/**
 * Called when the valuelist needs data, it has 3 modes.
 * real and display params both null: return the whole list
 * only display is specified, called by a typeahead, return a filtered list
 * only real value is specified, called when the list doesnt contain the real value for the give record value, this will insert this value into the existing list
 *
 * @param {String} displayValue The value of a lookupfield that a user types
 * @param realValue The real value for a lookupfield where a display value should be get for
 * @param {JSRecord} record The current record for the valuelist.
 * @param {String} valueListName The valuelist name that triggers the method. (This is the FindRecord in find mode, which is like JSRecord has all the columns/dataproviders, but doesn't have its methods)
 * @param {Boolean} findMode True if foundset of this record is in find mode
 *
 * @returns {JSDataSet} A dataset with 1 or 2 columns display[,real]
 *
 * @properties={typeid:24,uuid:"86317B5C-7D90-48E0-99B6-BF45F1013F28"}
 */
function getDataSetForMeses(displayValue, realValue, record, valueListName, findMode) {
	/**@type {JSDataSet} */
	var result = databaseManager.createEmptyDataSet(0,2);
	if (displayValue == null && realValue == null) {
		for (var i = 1 ; i <= 12 ; i++)
		{
			result.addRow([i18n.getI18NMessage('calendario.mes.'+i),i])
		}
	} else if (displayValue != null) {
		
	} else if (realValue != null) {
		result.addRow([i18n.getI18NMessage('calendario.mes.'+ realValue),realValue])
	}
	return result;

}

/**
 * @param {Date} fecha_mayor
 * @param {Date} fecha_menor
 * @return {Number} cantidad de años entre las fechas
 * @properties={typeid:24,uuid:"10810DEC-C430-4A26-9533-8233A724AA7C"}
 */
function diferenciaAnios(fecha_mayor, fecha_menor) {
	var $dif = fecha_mayor.getFullYear() - fecha_menor.getFullYear()
	if (fecha_mayor.getMonth() < fecha_menor.getMonth())
	{
		$dif--
	}
	return $dif
}
